今天我們開始來熟悉一下EdgeDB的基本知識,而EdgeDB在各作業系統的安裝方法可以參考官方文件。
scalar type包含了如str
、bool
、int64
等primitive
以及array
、tuple
及range
等作為容器的collection type
。
object type則為自定義的型態。每一個object type
可以包含property
或使用link
與其它object type
連接。
property則像是primitive
的wrapper,在其上加上一些預設值或是限制。
link就像一種relationship,可以透過它來連接其它的object type
。
所有property
與link
預設為optional
,可以省略不寫。如果為必須提供的,需要加上required
。
所有property
與link
預設為single
,可以省略不寫。如果property
可包含一個以上的scalar type
(需為同一型別)又或是link
可包含一個以上的object type
(需為同一型別),就需要加上multi
。
schema是EdgeDB的核心,包含了許多object type
(schema
不只有object type
,還有如function
及alias
等其它東西),類似於傳統database中的table
。
type Person {
required name: str;
}
type Movie {
required title: str;
multi actors: Person;
}
舉例來說,上面這個schema內定義了:
Person object type
property
,且為required
及single
,即每次insert
時都要提供一個str
型態。Movie object type
property
,且為required
及single
,即每次insert
時都要提供一個str
型態。link
,且為optional
及multi
,即每次insert
時不一定要提供;但如果有提供的話,可以包含一個以上的Person object
。EdgeQL
(EdgeDB SQL
)讓我們可以使用更簡潔的語法來針對所選取的object
進行操作。每一個object
,類似於傳統database中的row
。
select Movie {
title,
actors: {
name
}
}
filter .title = "The Matrix"
舉例來說,上面這個EdgeQL
選取了所有title property
為「"The Matrix"」的Movie object
,並顯示出title property
及actors link
中的name property
。
這裡我們介紹如何使用cli與EdgeDB互動。
首先利用edgedb project init
,建立專案資料夾,過程中會詢問instance名字及使用的版本。接著EdgeDB會幫忙建立instance,並建立一個dbschema
資料夾,裡面有一個default.esdl
,我們可以將schema全部置於其內的default module
(註1)。此外dbschema
資料夾還有一個空的migrations
資料夾,用來存放每次migration的指令。
定義好schema後,執行edgedb migration create
,會於dbschema/migrations
中建立副檔名為.edgeql
的檔案,用來記錄每次migration的變化。
執行edgedb migrate
後,將會正式執行dbschema/migrations
內的每一次migration。
接著於專案資料夾輸入EdgeDB,即可進入到該instance REPL
。此時可以使用EdgeQL
與instace
互動。
如果想刪除所有的object
,可以依照下面步驟執行:
5.1 執行edgedb branch wipe main
並鍵入Yes
來刪除所有的object
。
5.2 執行edgedb migrate
。
如果想要重置main branch時,可以依照下面步驟執行:
6.1 執行edgedb branch wipe main
並鍵入Yes
來刪除所有的object
。
6.2 刪除dbschema/migrations
中的所有*.edgeql
檔案。
6.3 重新編寫新的schema
至default.esdl
。預設的default.esdl
應該只有:
module default {}
6.4 執行edgedb migration create
及edgedb migrate
。
如果您需要一直測試schema,而需要反覆重置main branch時,可以將步驟簡化為:
7.1 修改default.esdl
。
7.2 刪除dbschema/migrations
中的所有*.edgeql
檔案。
7.3 執行edgedb branch wipe main --non-interactive && edgedb migration create && edgedb migrate
。其中的--non-interactive
是告知EdgeDB可以直接刪除data,不需詢問。
如果是想刪除instance時,可以執行edgedb instance destroy -I xxx --force
,其中xxx為此instance名字。
如果每次重開機後,EdgeDB並未自己啟動或啟動失敗時,可以執行edgedb instance start -I xxx
,其中xxx為此instance名字。依我在Windows11上使用的情況來看,此指令偶爾會失敗,需要執行兩次才能成功。
值得一提的是,edgedb開頭的指令亦可於REPL
中執行,只需要在指令前加上\
,且不用鍵入edgedb。例如於命令列中輸入edgedb migration create
,即相當於在REPL
中輸入\migration create
。
EdgeDB提供edgedb dump
的指令執行備份與edgedb restore
的指令執行讀回。
我們假設現在位於main branch且當前default.esdl
內schema為:
module default {
type User;
}
執行edgedb migration create
並執行edgedb migrate
。
執行edgedb query "insert User;"
建立一個User object
。
執行edgedb dump --all --format=dir first_dump"
將所有branch寫入到資料夾first_dump
。
執行edgedb branch wipe main
並鍵入Yes
來模擬刪除main branch中所有object
。
執行edgedb query "select User;"
可以確認回傳的為空EdgeDBSet
。
執行edgedb restore --all first_dump
將備份資料由first_dump
資料夾讀回。
執行edgedb query "select User;"
可以確認原先建立的User object
已被讀回。
這邊需要注意,成功地讀回除了需要edgedb dump
出的資料夾外,原先migrations
下的所有*.edgeql
也都必須保留。由於每個*.edgeql
的檔名及檔案內部都有特別的識別碼來辨別migraiton
的順序,將會於edgedb restore
時進行檢查。如果EdgeDB發現migrations
資料夾有前後無法匹配的情況(例如識別碼不一致或遺失檔案等),將無法成功讀回。
如果操作環境有安裝瀏覽器的話,可以於命令列中輸入edgedb ui,將會於瀏覽器中開啟一個漂亮的dashboard。
本日內容大多整理自EdgeDB GitHub repo README及get-started/quickstart。
註1:一個EdgeDB可以有多個instance,每個instance可以有多個branch(預設為main branch)。此外,雖然EdgeDB允許使用多個module
,但將所有schema統一置於default module
是一個常見的作法。因此本系列文若無特別說明,皆是將所有schema置於default.esdl
中的default module
。